package cn.iocoder.yudao.module.system.service.lottery;

import cn.iocoder.yudao.module.system.dal.dataobject.lottery.LotteryConfigDO;
import cn.iocoder.yudao.module.system.dal.mysql.lottery.LotteryConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 抽奖配置 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
@Slf4j
public class LotteryConfigServiceImpl implements LotteryConfigService {

    @Resource
    private LotteryConfigMapper lotteryConfigMapper;

    @PostConstruct
    public void init() {
        initDefaultConfigs();
    }

    @Override
    public LotteryConfigDO getConfigByKey(String configKey) {
        return lotteryConfigMapper.selectByConfigKey(configKey);
    }

    @Override
    public void saveOrUpdateConfig(String configKey, String configValue, String configName, String configDesc) {
        LotteryConfigDO existingConfig = lotteryConfigMapper.selectByConfigKey(configKey);
        
        if (existingConfig != null) {
            // 更新现有配置
            LotteryConfigDO updateConfig = new LotteryConfigDO();
            updateConfig.setId(existingConfig.getId());
            updateConfig.setConfigValue(configValue);
            updateConfig.setConfigName(configName);
            updateConfig.setConfigDesc(configDesc);
            lotteryConfigMapper.updateById(updateConfig);
        } else {
            // 创建新配置
            LotteryConfigDO newConfig = LotteryConfigDO.builder()
                    .configKey(configKey)
                    .configValue(configValue)
                    .configName(configName)
                    .configDesc(configDesc)
                    .enabled(true)
                    .build();
            lotteryConfigMapper.insert(newConfig);
        }
    }

    @Override
    public void initDefaultConfigs() {
        try {
            // 初始化每日抽奖次数限制
            saveOrUpdateConfig("daily_lottery_limit", "1", "每日抽奖次数限制", "用户每天可以抽奖的次数");

            // 初始化专业版报告每日限量
            saveOrUpdateConfig("professional_report_daily_limit", "100", "专业版报告每日限量", "专业版报告每天的中奖限量");

            // 初始化有专业版报告库存时的概率配置
            saveOrUpdateConfig("full_package_prob_with_stock", "2", "全套奖励概率(有库存)", "有专业版报告库存时全套奖励的中奖概率(%)");
            saveOrUpdateConfig("professional_report_prob_with_stock", "28", "专业版报告概率(有库存)", "有专业版报告库存时专业版报告的中奖概率(%)");
            saveOrUpdateConfig("basic_report_prob_with_stock", "25", "基础版报告概率(有库存)", "有专业版报告库存时基础版报告的中奖概率(%)");
            saveOrUpdateConfig("ask_count_prob_with_stock", "22", "问答次数概率(有库存)", "有专业版报告库存时问答次数的中奖概率(%)");
            saveOrUpdateConfig("content_member_prob_with_stock", "22", "内容会员概率(有库存)", "有专业版报告库存时内容会员的中奖概率(%)");
            saveOrUpdateConfig("no_prize_prob_with_stock", "1", "未中奖概率(有库存)", "有专业版报告库存时未中奖的概率(%)");

            // 初始化无专业版报告库存时的概率配置
            saveOrUpdateConfig("full_package_prob_no_stock", "1", "全套奖励概率(无库存)", "无专业版报告库存时全套奖励的中奖概率(%)");
            saveOrUpdateConfig("basic_report_prob_no_stock", "33", "基础版报告概率(无库存)", "无专业版报告库存时基础版报告的中奖概率(%)");
            saveOrUpdateConfig("ask_count_prob_no_stock", "33", "问答次数概率(无库存)", "无专业版报告库存时问答次数的中奖概率(%)");
            saveOrUpdateConfig("content_member_prob_no_stock", "32", "内容会员概率(无库存)", "无专业版报告库存时内容会员的中奖概率(%)");
            saveOrUpdateConfig("no_prize_prob_no_stock", "1", "未中奖概率(无库存)", "无专业版报告库存时未中奖的概率(%)");

            log.info("抽奖配置初始化完成");
        } catch (Exception e) {
            log.error("抽奖配置初始化失败", e);
        }
    }
}
